// minecraftFormatter.js
export class MinecraftFormatter {
    // Minecraft 颜色代码映射
    static colors = {
        '0': { color: '#000000', class: 'mc-black' },        // 黑色
        '1': { color: '#0000AA', class: 'mc-dark-blue' },    // 深蓝
        '2': { color: '#00AA00', class: 'mc-dark-green' },   // 深绿
        '3': { color: '#00AAAA', class: 'mc-dark-aqua' },     // 湖蓝
        '4': { color: '#AA0000', class: 'mc-dark-red' },      // 深红
        '5': { color: '#AA00AA', class: 'mc-dark-purple' },   // 紫色
        '6': { color: '#FFAA00', class: 'mc-gold' },          // 金色
        '7': { color: '#AAAAAA', class: 'mc-gray' },          // 灰色
        '8': { color: '#555555', class: 'mc-dark-gray' },     // 深灰
        '9': { color: '#5555FF', class: 'mc-blue' },          // 蓝色
        'a': { color: '#55FF55', class: 'mc-green' },         // 绿色
        'b': { color: '#55FFFF', class: 'mc-aqua' },          // 天蓝
        'c': { color: '#FF5555', class: 'mc-red' },           // 红色
        'd': { color: '#FF55FF', class: 'mc-light-purple' },  // 粉红
        'e': { color: '#FFFF55', class: 'mc-yellow' },        // 黄色
        'f': { color: '#FFFFFF', class: 'mc-white' },         // 白色
        'k': { class: 'mc-obfuscated' },                      // 随机字符
        'l': { class: 'mc-bold' },                            // 粗体
        'm': { class: 'mc-strikethrough' },                   // 删除线
        'n': { class: 'mc-underline' },                       // 下划线
        'o': { class: 'mc-italic' },                          // 斜体
        'r': { class: 'mc-reset' }                            // 重置
    };

    // 随机字符集 (Minecraft 风格)
    static randomChars = '!@#$%^&*()_+-=[]{}|;:,.<>?/~';

    /**
     * 解析 Minecraft 格式文本为 HTML
     * @param {string} text 包含 & 格式代码的文本
     * @param {boolean} useClasses 是否使用 CSS 类代替内联样式
     * @returns {string} HTML 字符串
     */
    static parse(text, useClasses = false) {
        if (!text) return '';

        let result = '';
        let currentStyles = [];
        let inColorCode = false;
        let randomSeed = 0;

        for (let i = 0; i < text.length; i++) {
            const char = text[i];

            if (char === '§' || char === '&') {
                inColorCode = true;
                continue;
            }

            if (inColorCode) {
                const code = char.toLowerCase();
                const format = this.colors[code];

                if (format) {
                    if (code === 'r') {
                        currentStyles = [];
                    } else {
                        currentStyles.push(format.class);
                    }
                }

                inColorCode = false;
                continue;
            }

            // 处理随机字符效果
            if (currentStyles.includes('mc-obfuscated')) {
                randomSeed++;
                const randomIndex = (char.charCodeAt(0) + randomSeed) % this.randomChars.length;
                result += this._wrapSpan(this.randomChars[randomIndex], currentStyles, useClasses);
            } else {
                result += this._wrapSpan(char, currentStyles, useClasses);
            }
        }

        return result;
    }

    /**
     * 创建带样式的 span 元素
     * @private
     */
    static _wrapSpan(char, styles, useClasses) {
        if (!styles.length) return char;

        if (useClasses) {
            return `<span class="${styles.join(' ')}">${char}</span>`;
        }

        // 内联样式
        const style = styles.map(style => {
                const code = style.replace('mc-', '');
                const format = Object.values(this.colors).find(f => f.class === style);
                return format?.color ? `color:${format.color};` : '';
            }).join('') +
            (styles.includes('mc-bold') ? 'font-weight:bold;' : '') +
            (styles.includes('mc-italic') ? 'font-style:italic;' : '') +
            (styles.includes('mc-underline') ? 'text-decoration:underline;' : '') +
            (styles.includes('mc-strikethrough') ? 'text-decoration:line-through;' : '');

        return `<span style="${style}">${char}</span>`;
    }

    /**
     * 去除所有格式代码
     * @param {string} text 包含格式代码的文本
     * @returns {string} 纯文本
     */
    static strip(text) {
        return text.replace(/[§&][0-9a-fk-or]/gi, '');
    }
}